在上一章節中,介紹了該如何使用man這個指令來查詢指定的指令的用法,在這一章節中,筆者將繼續的介紹基本操作文字檔案的方式以及相關的指令使用方法。
在解釋重新導向如何運作之前,可以搭配下面這張概念圖:
從上面的圖示可以知道,程式或是指令在執行的時候,會有三個管線,第一個就是使用者執行指令或是程式的時候,會有一個standard input的管線(stdin),這個就是當程式或是指令是互動式的時候,則會監控鍵盤所輸入的字串,當程式或指令執行一陣子之後,會輸出一些訊息,有些訊息是正常的資訊,那這些輸出的訊息則會重新導向到stdout,就是standard output,標準輸出的意思,而有些訊息會是在程式或是指令執行的時候出現錯誤訊息,這些錯誤的訊息則會導向到stderr之管線,即standard error,標準錯誤的意思,而編號0是stdin,編號1的即是stdout,編號2則是stderr。
知道管線上面會存放什麼訊息之後,接著就可以裡用幾個常用的指令來演示重新導向訊息的範例了。
首先開啟workstation虛擬機器,登入到rocky這個使用者之桌面環境之後,,筆者使用ls
這個指令當作範例,並執行下列的指令:
[rockylinux@workstation ~]$ ls ~
Desktop Downloads file2_soft ls.ps Music Public Videos
Documents file2_hard ls.pdf ls.txt Pictures Templates
ls
帶~
參數的話,指的是將家目錄底下的檔案與目錄(不包含隱藏檔案)列出,若是使用下列的指令:
[rockylinux@workstation ~]$ ls ~ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
Templates
Videos
執行ls ~ > home_list.txt
指令則是將輸出的檔案清單重新導向到home_list.txt
這個檔案中,接著可以使用cat
這個指令將指定的檔案內容給印出來到終端機上,就會得到上面的樣子了。那>
這是什麼?這指的是將stdin輸出的訊息重新導向到home_list.txt
檔案裡,也等價於ls 1> home_list.txt
指令,所以當使用ls
這個指令輸出的訊息是在stderr時候,則導向的檔案則會是空的,若只要將stderr
之訊息存下來,那只要改成ls not_found_dir 2> error.txt
即可,相關的執行命令之結果訊息如下:
[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
那若要將stdout與stderr分別重新導向到個別的檔案去儲存,那可以使用下列的方式做到:
[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$ ls ~ 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$ cat error.txt
[rockylinux@workstation ~]$
從上面的使用來看,就是分別將編號1之stdout與編號之stderr重新導向到success.txt
與error.txt
檔案儲存,若要將上述兩個管線都導向到同一個檔案呢?那可以參考下列的做法:
[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
ls: cannot access 'not_found_dir': No such file or directory
從上面的執行指令輸出結果,可以知道兩件事情:
2>&1
將stdout與stderr兩個管線的輸出訊息同時重新導向到message.txt
做儲存。>
會將輸出的訊息導向到指定的檔案之外,也會將同一個檔案之內容給覆蓋掉,那要留下原本的文字檔案要怎麼做呢?可以參考下列的做法:[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ ls not_found_dir >> message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
ls: cannot access 'not_found_dir': No such file or directory
從上面的執行指令輸出過程,可以看到,首先使用>
方式先將message.txt
檔案內容覆蓋成前家目錄的清單訊息,接著將ls not_found_dir
之錯誤訊息用>>
之方式將內容從原本message.txt
最後一行內容開始附加進去,這樣就會完整保存之前所存放在message.txt
檔案之內容了。
講完了重新導向以及標準輸出與錯誤之重新導向到檔案之後,接著來介紹另一個指令的功能,就是管線Pipelines了。這功能其實意思是,將前面的stdout輸出的結果當成stdin輸入並給下一個指定的指令,並兩者用|
隔開,那什麼意思呢?可以看一下下面的執行指令範例:
[rockylinux@workstation ~]$ ls ~ | tee home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
從上面執行指令的過程可以知道,首先先用ls ~
將家目錄除隱藏檔案之外的檔案與目錄全數列出,接著使用pipelines管線將前面輸出的檔案與目錄清單當成輸入轉給tee
這個指令,這個指令是用來將讀取標準輸入訊息以及將讀到的訊息寫入到指定的檔案中,因為使用tee
指令的時候,會一併把寫入的輸入訊息給印出來,若不要將這些輸入的訊息印出來的話,則可以將上述的指令改成:ls ~ | tee home_list.txt > /dev/null
,意思就是將寫入的訊息stdout之標準輸出導向到沒有,/dev/null
是一個特別的裝置檔案,可以稱為位元桶或是黑洞,導向這裡的路徑的訊息都會被吃掉與不見,因此就不會有輸出的訊息了。
除了使用tee
指令之外,另外也可以使用less
或是more
指令將用cat
指令所書的指定檔案內容終端的文字閱讀器瀏覽,相關執行的指令方式如下:
[rockylinux@workstation ~]$ ls ~/ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt | less
[rockylinux@workstation ~]$
Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
(END)
從上面的指令執行後的輸出訊息可以得知,首先先透過ls ~ > home_list.txt
將家目錄的清單給儲存起來,接著使用cat
指令將home_list.txt
檔案給印出並使用管線pipelines方式將前面檔案內容當成輸入並交給less
指令,接著less
便會開啟一個文字閱讀器讓圖取檔案內容變得方便,進入文字閱讀器之後,可以用鍵盤上與下方向鍵進行移動,要離開文字閱讀器的話,按下鍵盤的Q
即可以離開,若要搜尋的的話,則可以按下鍵盤的/
之後,便可以輸入要搜尋的關鍵字。
vim,是一個功能強大且多元的終端機上的文字編輯器,透過使用鍵盤的方式便可以進行文字檔案內容的編輯,為什麼要學vim呢?原因很簡單,因為有時候,主機並不會有桌面環境,只有終端機的情況下,有需要編輯檔案就無法使用圖形化介面的文字編輯器,像是gedit等,因此學習vim會變得如此的重要原因就在這裡。
要開啟vim指令很簡單,只要利用下面的方式即可以開啟指定的檔案:
[rockylinux@workstation ~]$ vim home_list.txt
[rockylinux@workstation ~]$
開啟檔案之後,就會進到文字編輯的模式,相關模式如下:
Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
~
~
~
~
~
"home_list.txt" 9L, 81C
相關的vim簡易操作方式如下:
有關於vim的用法還有很多,筆者這邊先列出最常見的用法供讀者們參考,日後更進階的vim用法可以讀者自行去翻閱其他書籍學習,但是筆者認為這些基本的vim用法學會之後,已經足以應付大部分的事情了。
ls /home/rockylinux
這個指令將輸出的結果導向到home_rockylinux.txt
檔案中。ls /home/rockylinux_not_found
這個指令將輸出的結果導向到home_rockylinux_not_found.txt
檔案中。ls /home/rockylinux_not_found
指令,不論是stdout或是stderr之結果都將要重新導向到message.txt
檔案中。ls /home/rockylinux_not_found
輸出的訊息顯示在終端機上。cat message.txt
指令並使用less
或more
文字閱讀器打開,請用一行指令完成。vim
指令進行文字編輯,並試著將message.txt
之第一行與最後一行刪除,並找到Documents
字串將其改成Replaced-Documents
。